package co.edu.uniandes.ecos.itera.tsp.interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Tiempos;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avance;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Avances;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogsD;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogD;

import co.edu.uniandes.ecos.itera.tsp.mundo.DelegadoNegocio;
import co.edu.uniandes.ecos.itera.tsp.mundo.Etapa;
import co.edu.uniandes.ecos.itera.tsp.mundo.Proyecto;

/**
 * Panel para ofrecer funcionalidad del manejo de proyectos
 */

@Tiempos({
	@LogT(date="2011-03-20", min=30, taskId=67),
	@LogT(date="2011-03-20", min=30, taskId=83),
	@LogT(date="2011-03-20", min=15, taskId=89)
})
@Avances({
	@Avance(taskId=89, termino='S')
})
@LogsD({
	@LogD(etapaInyectada=Etapa.DESARROLLO, idDefecto=14, taskId=89),  // Se te olvido establecer que la tarea 67 ya la terminaste
	@LogD(etapaInyectada=Etapa.DESARROLLO, idDefecto=14, taskId=89),  // Se te olvido establecer que la tarea 83 ya la terminaste
	@LogD(etapaInyectada=Etapa.DESARROLLO, idDefecto=4, taskId=89)    // NO se valida si el proyecto ya existe, antes de almacenarlo, para evitar duplicidad de proyectos
})
public class ManejarProyecto  extends JPanel implements ActionListener{
	/**
	 * Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	private DelegadoNegocio accesoAMundo;
	
	/**
	 * Proyecto que se esta trabajando en estos momentos en esta pantalla
	 */
	private Proyecto proyecto;
	
	/**
	 * Referencia al objeto contenedor. Este es el objeto
	 * que maneja la pantalla principal, o sea el admon de proyectos
	 */
	private MenuPrincipal referenciaAContenedor;
	
	
	/**
	 * Determina como unico a este objeto
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * Constante para definir la accion de almacenar
	 */
	private static final String ALMACENAR = "Almacenar";
	
	/**
	 * Nobre del proyecto
	 */
	private JTextField txtNombreProyecto;
	
	
	/**
	 * Boton de Almacenar
	 */
	private JButton btnAlmacenar;
	/**
	 * Consutrctor por defecto
	 * @param mundo Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	public ManejarProyecto(DelegadoNegocio mundo, MenuPrincipal contenedor)
	{
		this.accesoAMundo = mundo;
		this.referenciaAContenedor = contenedor;
		this.proyecto = null;
		
		this.pintarse();
	}

	/**
	 * Se encarga de pintar los elementos de la pantalla
	 */
	@Loc(size=15, taskId=83)
	private void pintarse()
	{
		setLayout(new GridLayout(4, 1));
		setPreferredSize(new Dimension(400, 200));
		
		TitledBorder border = BorderFactory.createTitledBorder("Manejador de Proyectos");
		border.setTitleColor(Color.BLUE);
		setBorder(border);
		
        add(new JLabel("Nombre del Proyecto"));
		
        this.txtNombreProyecto = new JTextField(30);
		add(this.txtNombreProyecto);
				
		this.btnAlmacenar = new JButton( "Guardar" );
		this.btnAlmacenar.setActionCommand( ALMACENAR );
		this.btnAlmacenar.addActionListener( this );
        add( this.btnAlmacenar );
	}
	
	/**
	 * Se encarga de cargar El proyecto en pantalla para
	 * poderlo manejar por el usuario
	 * @param proyectoACargar Informacion del proyecto que se desea actualizar
	 */
	@Loc(size=2, taskId=83)
	public void cargarEntidad(Proyecto proyectoACargar)
	{
		this.proyecto = proyectoACargar;
		
		this.txtNombreProyecto.setText("" + this.proyecto.getNombreProyecto());
	}
	
	/**
	 * Almacena el proyecto, ya sea creado o modificado
	 */
	@Loc(size=20, taskId=83)
	public void almacenar()
	{
		if(this.txtNombreProyecto.getText().trim().length() == 0)
		{
			JOptionPane.showMessageDialog(null, "Debe proveer los datos que se le estan preguntando", "Error", JOptionPane.ERROR_MESSAGE);
		}
		else
		{
			if(this.proyecto == null) // si se esta creando un proyecto
			{				
				String nomProyecto = this.txtNombreProyecto.getText().trim().toUpperCase();
				
				this.proyecto = new Proyecto();
				this.proyecto.setNombreProyecto(nomProyecto);
				
				this.accesoAMundo.agregarProyecto(this.proyecto);
			}
			else // Si ya existe el proyecto
			{
				String nomPoryecto = this.txtNombreProyecto.getText().trim().toUpperCase();
				
				this.proyecto.setNombreProyecto(nomPoryecto);
			}
			
			JOptionPane.showMessageDialog(null, "Proyecto almacenado exitosamente", "Exito", JOptionPane.INFORMATION_MESSAGE);
			
			this.referenciaAContenedor.cargarArbol();
		}
	}

	/**
	 * Acciones a realizar en la pantalla
	 */
	@Override
	@Loc(size=3, taskId=83)
	public void actionPerformed(ActionEvent e) 
	{
		String comando = e.getActionCommand( );

        if( comando.equals(ALMACENAR) )
            this.almacenar();
	}

}
